package com.rm.system;

import com.demo.blog.Blog;
import com.demo.blog.BlogController;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.ext.handler.ContextPathHandler;
import com.jfinal.ext.plugin.shiro.ShiroInterceptor;
import com.jfinal.ext.plugin.shiro.ShiroPlugin;
import com.jfinal.ext.plugin.sqlinxml.SqlInXmlPlugin;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.c3p0.C3p0Plugin;
import com.jfinal.plugin.ehcache.EhCachePlugin;
import com.jfinal.render.FreeMarkerRender;
import com.rm.common.shiro.ShiroExt;
import com.rm.demo.DemoController;
import com.rm.qjson.QJsonController;
import com.rm.system.index.IndexController;
import com.rm.system.model.Log;
import com.rm.system.model.Res;
import com.rm.system.model.Role;
import com.rm.system.model.User;

import freemarker.template.TemplateModelException;

/**
 * 系统入口。 API引导式配置
 */
public class AppConfig extends JFinalConfig {
	Routes routes;

	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		// System.out.println(System.getProperty("java.io.tmpdir"));

		// 加载少量必要配置，随后可用getProperty(...)获取值
		loadPropertyFile("a_little_config.txt");
		me.setDevMode(getPropertyToBoolean("devMode", false));

		me.setError404View("/common/error/404.html");
		me.setError401View("/common/error/401.html");
		me.setError403View("/common/error/403.html");
		me.setError500View("/common/error/500.html");

		try {
			//注册工具类，可在freemarker中使用
			FreeMarkerRender.getConfiguration().setSharedVariable("so",
					new ShiroExt());
			FreeMarkerRender.getConfiguration().setSharedVariable("po",
					PropKit.use("a_little_config.txt"));
		} catch (TemplateModelException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		this.routes = me;
		me.add("/", IndexController.class, "/common/index"); // 第三个参数为该Controller的视图存放路径
		me.add("qjson", QJsonController.class, "/view/qjson");

		// demo博客
		me.add("blog", BlogController.class, "/view/blog");
		me.add("demo", DemoController.class, "/view/demo");
	}

	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		// 配置C3p0数据库连接池插件
		/**
		 * C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"),
		 * getProperty("user"), getProperty("password").trim());
		 * me.add(c3p0Plugin);
		 * 
		 * // 配置ActiveRecord插件 ActiveRecordPlugin arp = new
		 * ActiveRecordPlugin(c3p0Plugin); me.add(arp); arp.addMapping("blog",
		 * Blog.class); // 映射blog 表到 Blog模型
		 **/

		C3p0Plugin cp = new C3p0Plugin(getProperty("jdbcurl"),
				getProperty("username"), getProperty("password").trim());
		// 配置Oracle驱动
		cp.setDriverClass(getProperty("driver"));
		me.add(cp);
		ActiveRecordPlugin arp2 = new ActiveRecordPlugin(cp);
		me.add(arp2);
		// 配置Oracle方言
		arp2.setDialect(new OracleDialect());
		// 配置属性名(字段名)大小写不敏感容器工厂
		arp2.setContainerFactory(new CaseInsensitiveContainerFactory());

		// 映射表
		arp2.addMapping("blog", Blog.class); // 映射blog 表到 Blog模型
		arp2.addMapping("hly_org_employee", "userid", User.class);
		arp2.addMapping("hly_role", "roleid", Role.class); //
		arp2.addMapping("hly_role_menu", "menuid", Res.class); //
		arp2.addMapping("hly_log", "id", Log.class); //

		// 安装插件
		me.add(new EhCachePlugin());
		// shiro权限框架
		me.add(new ShiroPlugin(routes));
		// xml配置sql语句
		me.add(new SqlInXmlPlugin());
	}

	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		// shiro 拦截器，判断是否符合访问权限
		// 处理注解方式的权限控制
		me.add(new ShiroInterceptor());
		// 处理数据库中配置的权限
		me.add(new com.rm.common.shiro.ShiroInterceptor());
	}

	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {
		// 配置上下文名称，在jsp用引用
		me.add(new ContextPathHandler("ctx"));
	}

	/**
	 * 建议使用 JFinal 手册推荐的方式启动项目 运行此 main
	 * 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
	 */
	public static void main(String[] args) {
		JFinal.start("src/main/webapp", 80, "/", 5);
	}
}
